package concurrent;

import java.util.*;

/**
 * 万能字符单词拼写
 * <p>
 * 有一个字符串数组words和一个字符串chars。
 * 假如可以用chars中的字母拼写出words中的某个“单词”（字符串），那么我们就认为你掌握了这个单词。
 * words的字符仅由 a-z 英文小写字母组成。 例如: abc
 * chars 由 a-z 英文小写字母和 “?”组成。其中英文问号“?”表示万能字符，能够在拼写时当做任意一个英文字母。 例如： "?" 可以当做 "a"等字母。
 * 注意：每次拼写时，chars中的每个字母和万能字符都只能使用一次。
 * 输出词汇表words中你掌握的所有单词的个数。 没有掌握任何单词，则输出0。
 * <p>
 * <p>
 * 第1行输入数组words的个数，记为N。
 * 从第2行开始到第N+1行依次输入数组words的每个字符串元素。
 * 第N+2行输入字符串chars。
 * <p>
 * 输出一个整数，表示词汇表words中你掌握的单词个数。
 * <p>
 * 注意：
 * 1 <= words.length <= 100
 * 1 <= words[i].length, chars.length <= 100
 * 所有字符串中都仅包含小写英文字母、英文问号
 * <p>
 * 示例：
 * 4
 * cat
 * bt
 * hat
 * tree
 * atach??
 * 输出：
 * 3
 * 可以拼写字符串"cat"、"bt"和"hat"
 * <p>
 * 输入：
 * 3
 * hello
 * world
 * cloud
 * welldonehoneyr
 * 输出
 * 2
 * 可以拼写字符串"hello"和"world"
 * <p>
 * 示例3：
 * 输入：
 * 3
 * apple
 * car
 * window
 * welldoneapplec?
 * 输出
 * 2
 * 可以拼写字符串"apple"和"car"
 */
public class Test2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int size = Integer.valueOf(scanner.nextLine());
        List<String> words = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            words.add(scanner.nextLine());
        }
        String chars = scanner.nextLine();
        Map<Character, Integer> charsMap = countCharacter(chars);

        int anyNum = 0;
        if (charsMap.containsKey('?')) {
            anyNum = charsMap.get('?');
        }
        int total = 0;
        for (String word : words) {
            Map<Character, Integer> wordMap = countCharacter(word);
            //记录word中比chars中多的字符数量
            int diff = 0;
            Set<Character> characters = wordMap.keySet();
            for (Character character : characters) {
                if (charsMap.containsKey(character)) {
                    Integer wordNum = wordMap.get(character);
                    Integer charNum = charsMap.get(character);
                    if (wordNum > charNum) {
                        diff += wordNum - charNum;
                    }
                } else {
                    //word中的字符在chars中不存在
                    diff += wordMap.get(character);
                }
            }
            //如果差异的字符数量小等于‘？’的数量，则可以拼凑成字符串
            if (diff <= anyNum) {
                total++;
            }
        }
        System.out.println(total);
    }

    private static Map<Character, Integer> countCharacter(String chars) {
        Map<Character, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < chars.length(); i++) {
            Character c = chars.charAt(i);
            hashMap.put(c, hashMap.getOrDefault(c, 0) + 1);
        }
        return hashMap;
    }
}
